/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package controllers;

import dao.DaoEscola;
import dao.DaoMateria;
import dao.DaoNota;
import dao.DaoSerie;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.bean.SessionScoped;
import javax.faces.bean.ViewScoped;
import javax.persistence.Persistence;
import model.Admin;
import model.Escola;
import model.Materia;
import model.Nota;
import model.Pessoa;
import model.Secretario;
import model.Serie;

/**
 *
 * @author ronaldomartins
 */
@ManagedBean
@ViewScoped
public class ControllerMovNotas {
    private DaoEscola daoEscola = new DaoEscola();
    private DaoMateria daoMateria = new DaoMateria();
    private DaoSerie daoSerie = new DaoSerie();
    private String status = "Novo";
    private String id = "";
    private String escola = "";
    private String serie = "";
    private String numero = "";
    private String materia = "";
    private String nota = "";
    private boolean desabilita=false;

    public boolean isDesabilita() {
        return desabilita;
    }

    public void setDesabilita(boolean desabilita) {
        this.desabilita = desabilita;
    }
    
    
    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }
    
    public String getSerie() {
        return serie;
    }

    public void setSerie(String serie) {
        this.serie = serie;
    }

    public String getNumero() {
        return numero;
    }

    public void setNumero(String numero) {
        this.numero = numero;
    }

    public String getMateria() {
        return materia;
    }

    public void setMateria(String materia) {
        this.materia = materia;
    }

    public String getNota() {
        return nota;
    }

    public void setNota(String nota) {
        this.nota = nota;
    }
    

    public String getEscola() {
        return escola;
    }

    public void setEscola(String escola) {
        this.escola = escola;
        setSerie("");
    }
    /**
     * Creates a new instance of ControllerMovNotas
     */
    public ControllerMovNotas() {
    }
    
    public List<Escola> retornaEscolas(){
        return daoEscola.listarTodos();
    }
    
    public List<Serie> retornaSerie(){
        List<Serie> series = new ArrayList();
        if ((escola!=null) && (!escola.equals(""))){
            Escola escola = (Escola) daoEscola.buscarPorId(new Long(getEscola()));
            series = escola.getSeries();
        }
        return series;
    }
    
    public List<Materia> retornaMateria(){
        List<Materia> lista = daoMateria.listarTodos();
        return lista;
    }
    
    public List<Nota> retornaNotas(){
        List<Nota> notas = new ArrayList<Nota>();
        if ((!getSerie().equals("")) && (!getMateria().equals(""))){
            notas = (new DaoNota()).listaNotasPorEscolaNotaMateria(new Long(getSerie()), new Long(getMateria()));
        }
        
        Collections.sort(notas,new Comparator<Nota>(){

            @Override
            public int compare(Nota o1, Nota o2) {
                if (o1.getNumero() > o2.getNumero()) return -1;
                else if (o1.getNumero()< o2.getNumero()) return 1;
                else return 0;
            }
            
        });
        return notas;
    }
    
    public String converteTipoEnsino(String param){
        if (param.equals("em")) return "Ensino Médio";
        else if (param.equals("ef")) return "Ensino Fundamental";
        else return "";
    }
    
    public void gravar(){
        Pessoa secretario = (Pessoa) util.UtilWeb.getAtributoSessao("pessoa");
        if (    (secretario ==null) || 
                (secretario.getId() == null) ||
                (secretario.getId().intValue() == 0) ||          
                (
                   (! (secretario instanceof Secretario) ) &&
                   (! (secretario instanceof Admin) ) 
                )
                )
                {
            util.UtilWeb.enviarMessagemErro("msg", "Não é possível gravar o registro! "+
                                                                             "Você deve estar logado como Secretário ou Administrador");
        }else{
            if (getStatus().equals("Novo")){

                Serie serie = (Serie) daoSerie.buscarPorId(new Long(getSerie()));

                List notas = serie.getNotas();
                
                
                Materia materia = (Materia) daoMateria.buscarPorId(new Long(getMateria()));
                Nota nota = new Nota();
                nota.setNota(new Double(getNota()));
                nota.setNumero(Integer.parseInt(getNumero()));
                nota.setSecretario((Secretario)secretario);
                nota.setMateria(materia);
                
                if (!notas.contains(nota)){
                    notas.add(nota);
                    (new DaoSerie()).atualizar(serie);
                    setNumero("");
                    setNota("");
                    util.UtilWeb.enviarMessagemInfo("msg", "Nota inserida com sucesso");
                }else{
                    util.UtilWeb.enviarMessagemErro("msg", "Nota já existe");
                }
            }else{
                DaoNota daoNota = new DaoNota();
                Nota nota = (Nota) daoNota.buscarPorId(new Long(getId()));
                nota.setNota(Double.parseDouble(getNota()));
                daoNota.atualizar(nota);
                
                setNumero("");
                setNota("");
                setDesabilita(false);
                util.UtilWeb.enviarMessagemInfo("msg", "Nota atualizada com sucesso");                
            }
        }
    }
    
    public void excluir(Long id){
        DaoNota daoNota = new DaoNota();
        Nota nota = (Nota) daoNota.buscarPorId(id);
        Serie serie = (Serie) daoSerie.buscarPorId(new Long(getSerie()));
        serie.getNotas().remove(nota);
        daoSerie.atualizar(serie);
        util.UtilWeb.enviarMessagemInfo("msg", "Nota excluída com sucesso!");
    }
    
    public void alterar(Long id){
        Nota nota = (Nota) (new DaoNota()).buscarPorId(id);
        setNumero(""+nota.getNumero());
        setId(""+nota.getId());
        setNota(""+nota.getNota());
        setDesabilita(true);
        setStatus("Alterar");
    }
    
    public void novo(){
        setDesabilita(false);
        setStatus("Novo");
        setNumero("");
        setNota("");
        setId("");
    }
    
}
